/**
 * @file demo_devicemanager_usage.cpp
 * @brief DeviceManager 和 MeterModel 使用示例
 *
 * 演示如何使用设备管理器进行：
 * 1. 配置总线
 * 2. 自动拓扑识别
 * 3. 启动轮询
 * 4. 在线状态监测
 * 5. 使用 MeterModel 对接 QML
 */

#include <QCoreApplication>
#include <QTimer>
#include <QDebug>
#include "io/serialportmanager.h"
#include "core/devicemanager.h"
#include "model/metermodel.h"
#include "utils/logger.h"
#include "utils/config.h"

int main(int argc, char *argv[])
{
    QCoreApplication app(argc, argv);

    // 初始化日志系统
    Logger::instance()->log(LogLevel::Info, "========== DeviceManager 使用示例 ==========");

    // ========== 第1步：创建串口管理器 ==========
    SerialPortManager portManager;

    // 扫描可用串口
    QStringList ports = portManager.scanAvailablePorts();
    qDebug() << "可用串口：" << ports;

    // 虚拟串口配置说明：
    // COM1 ↔ COM2 (虚拟串口对1)
    // COM3 ↔ COM4 (虚拟串口对2)
    // COM5 ↔ COM6 (虚拟串口对3)
    // 主程序连接：COM1, COM3, COM5
    // 模拟器连接：COM2, COM4, COM6

    // 明确指定要使用的串口
    QStringList targetPorts = {"COM1", "COM3", "COM5"};

    qDebug() << "\n========== 打开串口 ==========";
    for (const QString &port : targetPorts)
    {
        if (ports.contains(port))
        {
            portManager.openPort(port, 115200);
            qDebug() << "已打开串口：" << port;
        }
        else
        {
            qDebug() << "警告：串口" << port << "不可用";
        }
    }

    // ========== 第2步：创建设备管理器 ==========
    DeviceManager deviceManager(&portManager);

    // 连接信号
    QObject::connect(&deviceManager, &DeviceManager::topologyDiscoveryStarted, []()
                     { qDebug() << "【拓扑识别】开始扫描..."; });

    QObject::connect(&deviceManager, &DeviceManager::topologyDiscoveryProgress,
                     [](int current, int total)
                     {
                         qDebug() << QString("【拓扑识别】进度: %1/%2").arg(current).arg(total);
                     });

    QObject::connect(&deviceManager, &DeviceManager::deviceDiscovered, [](int meterId)
                     { qDebug() << QString("【拓扑识别】发现设备: 站号 %1").arg(meterId); });

    QObject::connect(&deviceManager, &DeviceManager::topologyDiscoveryCompleted,
                     [](int totalFound)
                     {
                         qDebug() << QString("【拓扑识别】完成！共发现 %1 块在线电表").arg(totalFound);
                     });

    QObject::connect(&deviceManager, &DeviceManager::deviceOnline, [](int meterId)
                     { qDebug() << QString("【状态监测】电表 %1 上线").arg(meterId); });

    QObject::connect(&deviceManager, &DeviceManager::deviceOffline, [](int meterId)
                     { qDebug() << QString("【状态监测】电表 %1 离线").arg(meterId); });

    // ========== 第3步：配置总线 ==========
    qDebug() << "\n========== 配置总线 ==========";

    // 配置总线1：配电室A，站号1-10，使用 COM1（模拟器中有站号1-10）
    {
        DeviceManager::BusConfig busA;
        busA.busId = 1;
        busA.busName = "配电室A";
        busA.portName = "COM1"; // 对应虚拟串口对 COM1↔COM2
        busA.startSlaveId = 1;
        busA.endSlaveId = 10; // 修改为10，匹配模拟器
        deviceManager.addBusConfig(busA);
        qDebug() << "总线1: COM1, 站号1-10";
    }

    // 配置总线2：配电室B，站号41-50，使用 COM3（模拟器中有站号41-50）
    {
        DeviceManager::BusConfig busB;
        busB.busId = 2;
        busB.busName = "配电室B";
        busB.portName = "COM3"; // 对应虚拟串口对 COM3↔COM4
        busB.startSlaveId = 41;
        busB.endSlaveId = 50; // 修改为50，匹配模拟器
        deviceManager.addBusConfig(busB);
        qDebug() << "总线2: COM3, 站号41-50";
    }

    // 配置总线3：配电室C，站号81-90，使用 COM5（模拟器中有站号81-90）
    {
        DeviceManager::BusConfig busC;
        busC.busId = 3;
        busC.busName = "配电室C";
        busC.portName = "COM5"; // 对应虚拟串口对 COM5↔COM6
        busC.startSlaveId = 81;
        busC.endSlaveId = 90; // 修改为90，匹配模拟器
        deviceManager.addBusConfig(busC);
        qDebug() << "总线3: COM5, 站号81-90";
    }

    // ========== 第4步：启动自动拓扑识别 ==========
    qDebug() << "\n========== 启动拓扑识别 ==========";
    deviceManager.startTopologyDiscovery(500); // 每个站号超时时间500ms

    // 等待拓扑识别完成后启动轮询
    QObject::connect(&deviceManager, &DeviceManager::topologyDiscoveryCompleted,
                     [&deviceManager](int totalFound)
                     {
                         if (totalFound > 0)
                         {
                             qDebug() << "\n========== 启动轮询 ==========";
                             deviceManager.startPolling(500); // 轮询间隔500ms

                             qDebug() << "\n========== 启动在线状态监测 ==========";
                             deviceManager.startOnlineMonitor(5000, 10); // 每5秒检查一次，超时10秒

                             // 打印当前状态
                             QTimer::singleShot(3000, [&deviceManager]()
                                                {
                                                    qDebug() << "\n========== 当前状态 ==========";
                                                    qDebug() << "电表总数：" << deviceManager.totalCount();
                                                    qDebug() << "在线电表：" << deviceManager.onlineCount();
                                                    qDebug() << "离线电表：" << deviceManager.offlineCount();

                                                    // 打印前5个电表的数据
                                                    QVector<Meter *> onlineMeters = deviceManager.getOnlineMeters();
                                                    qDebug() << "\n========== 在线电表数据（前5个）==========";
                                                    for (int i = 0; i < qMin(5, onlineMeters.size()); ++i)
                                                    {
                                                        Meter *meter = onlineMeters[i];
                                                        qDebug() << QString("站号: %1, 名称: %2")
                                                                        .arg(meter->meterId())
                                                                        .arg(meter->name());
                                                        qDebug() << QString("  电压: Ua=%1V, Ub=%2V, Uc=%3V")
                                                                        .arg(meter->ua(), 0, 'f', 1)
                                                                        .arg(meter->ub(), 0, 'f', 1)
                                                                        .arg(meter->uc(), 0, 'f', 1);
                                                        qDebug() << QString("  电流: Ia=%1A, Ib=%2A, Ic=%3A")
                                                                        .arg(meter->ia(), 0, 'f', 3)
                                                                        .arg(meter->ib(), 0, 'f', 3)
                                                                        .arg(meter->ic(), 0, 'f', 3);
                                                        qDebug() << QString("  平均电压: %1V, 平均电流: %2A, 总功率: %3W")
                                                                        .arg(meter->averageVoltage(), 0, 'f', 1)
                                                                        .arg(meter->averageCurrent(), 0, 'f', 3)
                                                                        .arg(meter->totalPower(), 0, 'f', 1);
                                                        qDebug() << "";
                                                    } });
                         }
                         else
                         {
                             qDebug() << "未发现任何在线电表，请检查硬件连接";
                         }
                     });

    // ========== 第5步：创建 MeterModel（用于 QML）==========
    MeterModel meterModel(&deviceManager);

    qDebug() << "\n========== MeterModel 示例 ==========";
    qDebug() << "当前模型中的电表数量：" << meterModel.rowCount();

    // 连接模型信号
    QObject::connect(&meterModel, &MeterModel::countChanged, [&meterModel]()
                     { qDebug() << "MeterModel 计数改变：" << meterModel.rowCount(); });

    // 演示过滤功能
    QTimer::singleShot(5000, [&meterModel, &deviceManager]()
                       {
                           qDebug() << "\n========== 演示过滤功能 ==========";

                           // 显示全部
                           meterModel.setFilterMode(MeterModel::ShowAll);
                           qDebug() << "显示全部：" << meterModel.rowCount();

                           // 仅显示在线
                           meterModel.setFilterMode(MeterModel::ShowOnline);
                           qDebug() << "仅显示在线：" << meterModel.rowCount();

                           // 仅显示离线
                           meterModel.setFilterMode(MeterModel::ShowOffline);
                           qDebug() << "仅显示离线：" << meterModel.rowCount();

                           // 按总线过滤
                           meterModel.setFilterMode(MeterModel::ShowByBus);
                           meterModel.setFilterBusId(1);
                           qDebug() << "仅显示总线1：" << meterModel.rowCount();

                           // 恢复显示全部
                           meterModel.setFilterMode(MeterModel::ShowAll); });

    // ========== 第6步：运行一段时间后退出 ==========
    QTimer::singleShot(20000, [&app]()
                       {
                           qDebug() << "\n========== 示例结束 ==========";
                           app.quit(); });

    return app.exec();
}
